#ifndef UTILITY_NONCOPYABLE_H
#define UTILITY_NONCOPYABLE_H


#define NONCOPYABLE(Cls)                     \
    Cls(const Cls &) = delete;            \
    Cls(const Cls &&) = delete;           \
    Cls &operator=(const Cls &) = delete; \
    Cls &operator=(const Cls &&) = delete

/// @class object-reference sematics derived
class Noncopyable {
protected:
    Noncopyable() = default;
    ~Noncopyable() = default;

private:
    NONCOPYABLE(Noncopyable);
};

#endif